www.gusucode.com > VANET Toolbox- A Vehicular Network Simulator based on DES 程序工具箱matlab源码 > VANET Toolbox- A Vehicular Network Simulator based on DES/VANET_Toolbox/VANET_Toolbox_2018a/demoLC.m

    function demoLC(varargin)  % demoLC(numVehicle,simTime,laneChangingOption,isappTXTon);
    if numel(varargin{1})==1
        numVehicles=varargin{1};    
    else
        numVehicles=numel(varargin{1});    
    end
    
%     numVehicles=varargin{1};
    numVehicles=max(4,numVehicles);
    
    simTime=varargin{2};
    isUIon=0;
    if nargin>2
        switch varargin{3}
            case 'per'
                laneChangingOption='Performance Lane Changing';                
            case 'con'
                laneChangingOption='Conservative Lane Changing';       
            otherwise
                laneChangingOption='Brake without Lane Changing';
        end        
    else
        laneChangingOption='Brake without Lane Changing';
    end
    
    disp(laneChangingOption);
    
    if nargin==4
        isUIon=varargin{4};
    end
    
    %%
    vanet_init();


    vehicle=struct(...        
        'PositionX',0,...
        'PositionY',0,...
        'Speed',50,...
        'Acceleration',10,...  % init acceleration
        'VehicleID',1,...
        'lane',1);

    vanet=struct(...                   
        'vehicles',[],...           
        'linkConfig','Auto',...    
        'txtEnable',0,...       
        'appTXTEnable',1);    

    n = vanet;               
  
    for i=1:numVehicles                         
        s{i}=vehicle;      
        s{i}.VehicleID=i;           
        n.vehicles=[n.vehicles s{i}];                   
    end

    h = new_system;

    try
        set_param(h, 'StopTime', num2str(simTime));

        mdl = get_param(h, 'Name');

        add_block('VANETlib/Control Panel', [mdl '/controlPanel'], ...                            
            'txtEnable',n.txtEnable,...
            'appTXTEnable',n.appTXTEnable,...
            'isUIon',isUIon,...
            'road','highway',...
            'roadLength','1680',...
            'laneChangingOption',laneChangingOption);

        add_block('VANETlib/vanet PHY layer', [mdl '/VANET'], ...     
            'numStations', num2str(numVehicles));    
        
        %%
        car1=n.vehicles(1);    
        car1.Speed=80;
%         car1.Acceleration=10;
        car1.lane=1;
        car1.PositionX=260;
        car1.PositionY=0;

        car2=n.vehicles(2);    
        car2.Speed=50;
        car2.lane=1;
        car2.PositionX=300;
        car2.PositionY=0;

        car3=n.vehicles(3);    
        car3.Speed=90;
        car3.lane=1;
        car3.PositionX=200;
        car3.PositionY=4;

        car4=n.vehicles(4);    
        car4.Speed=60;
        car4.lane=1;
        car4.PositionX=320;
        car4.PositionY=4;                

        carSet=[car1,car2,car3,car4];
        
        %%                        
        if numVehicles>4                           

            zone1 = min(car1.PositionX,car2.PositionX)-80:-30:1;
            zone2 = min(car3.PositionX,car4.PositionX)-80:-30:1;    
            
            zone3 = max(car2.PositionX,car1.PositionX)+40:30:780;           
            zone4 = max(car3.PositionX,car4.PositionX)+60:30:780;
        
            zones={zone1,zone2,zone3,zone4};                        
            
            for j=5:numVehicles
                counter=mod(j,4);
                if counter==0
                    counter=4;
                end
                zone=zones{counter};
                                
                if ~isempty(zone)
                    cars=n.vehicles(j);                                                   
                    cars.PositionX=zone(1);                    
                    if counter==1 || counter==3                    
                        cars.lane=car1.lane;                                                    
                        cars.PositionY=car1.PositionY;                                                 
                    else                        
                        cars.lane=car3.lane;                        
                        cars.PositionY=car3.PositionY;                                                 
                    end
                    
                    if numel(varargin{1})>1
                        speedArray=varargin{1};
                        cars.Speed=speedArray(j);
                    end
                    
%                     cars.Speed=speedArray(j);                    
                    
                    zone=zone(zone~=zone(1));
                    zones{counter}=zone;
                    
                    carSet=[carSet cars];
                elseif counter<4                    
                    counter=counter+1;
                    zone=zones{counter};
                    
                    cars=n.vehicles(j);                                                   
                    cars.PositionX=zone(1);                    
                    if counter==1 || counter==3                    
                        cars.lane=car1.lane;                                                    
                        cars.PositionY=car1.PositionY;                                                 
                    else                        
                        cars.lane=car3.lane;                        
                        cars.PositionY=car3.PositionY;                                                 
                    end              
                    
                    if numel(varargin{1})>1
                        speedArray=varargin{1};
                        cars.Speed=speedArray(j);
                    end
                    
%                     cars.Speed=speedArray(j);
                                        
                    zone=zone(zone~=zone(1));                    
                    zones{counter}=zone;
                    
                    carSet=[carSet cars];
                else % empty(zone) && counter>=4
                    disp('ERROR: Number of vehicles out of road space !!!');
                    break;
                end                                                                                                                                        
            end
        end
            

        for i=1:length(carSet)
            s=carSet(i);            
            add_block('VANETlib/Vehicle', [mdl '/Car' num2str(i)], ...    
                'carID', num2str(s.VehicleID), ...                
                'startSpd',num2str(s.Speed),...          
                'startAcc',num2str(s.Acceleration),...
                'initLane',num2str(s.lane),...
                'startPosX',num2str(s.PositionX),...       
                'startPosY',num2str(s.PositionY));
        end

        stopfcn=strcat("fcn_stopfcnList(", num2str(numVehicles),');');             
        
        set_param(mdl,'StopFcn',stopfcn);   
        
        sim(mdl);
        close_system(mdl,0);



    catch e        
        close_system(mdl,0);    
        rethrow(e);
    end

end